// Copyright 2022 Huawei Cloud Computing Technology Co., Ltd.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import RTCCloudApp from "./rtc/RTCCloudApp";
import CPHCloudApp from "./CPHCloudApp";
import AppController from "./AppController";

class CloudApp {
    constructor(containerId, options) {
        this.channel = this._getChannel(containerId, options);
    }

    static isSupport() {
        return AppController.isSupport();
    }

    static getVersion() {
        return __APP_VERSION__;
    }

    getVolume() {
        return this.channel.getVolume();
    }

    setVolume(value) {
        this.channel.setVolume(value);
    }

    exit() {
        this.channel.exit();
    }

    pause() {
        this.channel.pause();
    }

    resume() {
        this.channel.resume();
    }

    reconnect() {
        this.channel.reconnect();
    }

    fullscreenToggle(fullscreenElementId) {
        this.channel.fullscreenToggle(fullscreenElementId);
    }

    isFullscreen() {
        return this.channel.isFullscreen();
    }

    on(eventName, callback) {
        this.channel.on(eventName, callback);
    }

    off(eventName, callback) {
        this.channel.off(eventName, callback);
    }

    setResolution(clarityVal) {
        this.channel.setResolution(clarityVal);
    }

    setMediaConfig(config) {
        this.channel.setMediaConfig(config);
    }

    sendDataToCloudApp(data) {
        this.channel.sendDataToCloudApp(data);
    }

    _getChannel(containerId, options) {
        const channelType = options.channelType || 'WebRtc';
        if (channelType === 'WebRtc') {
            return new RTCCloudApp(containerId, options);
        }
        if (channelType === 'WebSocket') {
            return new CPHCloudApp(containerId, options);
        }
        throw 'channel type is error';
    }
}

export default CloudApp;
